﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace QuanLyNganHangDe.GUI.TacNghiep
{
    using BLL;
    using DAL;
    using DAL.Models;
    using System.IO;
    using System.Threading;

    public partial class FormDeThi_ChiTiet : Form
    {
        private DeInRa m_DeThi;
        private NamHoc m_NamHoc;
        private HocKy m_HocKy;
        private QLNHD_KHContext m_Context = null;
        private QLNHD_KHContext Context
        {
            get
            {
                if (m_Context == null)
                    m_Context = QLNHD_KHContext.GetContext();
                return m_Context;
            }
        }

        delegate void LoadRtfCodeHandler(TXTextControl.TextControl rtb, string rtfCode);
        private static void LoadRtfCode(TXTextControl.TextControl rtb, string rtfCode)
        {
            try
            {
                if (rtb.InvokeRequired)
                    rtb.Invoke(new LoadRtfCodeHandler(LoadRtfCode), rtb, rtfCode);
                else
                {
                    try
                    {
                        rtb.Load(rtfCode, TXTextControl.StringStreamType.RichTextFormat);
                    }
                    catch (Exception exc2)
                    { }
                }
            }
            catch (Exception exc)
            { }
        }

        delegate void AppendRtfCodeHandler(TXTextControl.TextControl rtb, string rtfCode);
        private static void AppendRtfCode(TXTextControl.TextControl rtb, string rtfCode)
        {
            try
            {
                if (rtb.InvokeRequired)
                    rtb.Invoke(new AppendRtfCodeHandler(AppendRtfCode), rtb, rtfCode);
                else
                {
                    try { rtb.Append(rtfCode, TXTextControl.StringStreamType.RichTextFormat, TXTextControl.AppendSettings.StartWithNewParagraph); }
                    catch { }
                }
            }
            catch { }
        }

        delegate void SetQuestionContentHandler(TXTextControl.TextControl rtb, string stQuestionTitle, string stQuestionContentRtfCode);
        private static void SetQuestionContent(TXTextControl.TextControl rtb, string stQuestionTitle, string stQuestionContentRtfCode)
        {
            try
            {
                if (rtb.InvokeRequired)
                    rtb.Invoke(new SetQuestionContentHandler(SetQuestionContent), rtb, stQuestionTitle, stQuestionContentRtfCode);
                else
                {
                    try
                    {
                        rtb.Text = stQuestionTitle;
                        rtb.SelectAll();
                        rtb.Selection.FontName = "Times New Roman";
                        rtb.Selection.Bold = true;
                        rtb.Selection.FontSize = 20 * 13;
                        rtb.Selection.ListFormat.Type = TXTextControl.ListType.None;

                        rtb.Append(stQuestionContentRtfCode, TXTextControl.StringStreamType.RichTextFormat, TXTextControl.AppendSettings.None);
                    }
                    catch { }
                }
            }
            catch { }
        }

        public static void writeLog(string stFormat, params object[] arg)
        {
            return;
            System.IO.File.AppendAllText(@"d:\logfile.txt", DateTime.Now.ToString("hh:mm:ss") + " " + string.Format(stFormat, arg) + "\r\n");
        }

        /// <summary>
        /// Lấy nội dung đề thi (dưới dạng RtfCode)
        /// </summary>
        /// <param name="deInRa"></param>
        /// <param name="hocKy"></param>
        /// <param name="namHoc"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public static string GetNoiDungDeThi(
            Panel pnlParent,
            DAL.Models.DeInRa deInRa,
            DAL.Models.HocKy hocKy,
            DAL.Models.NamHoc namHoc,
            DAL.Models.QLNHD_KHContext context,
            bool needToLoadDetailDataOfDeInRa = false)
        {
            //Panel pnlParent = new Panel();
            writeLog("GetNoiDungDeThi {0}-------------------", deInRa.TenDeThi);
            string rtfCode = null;
            using (var rtbResult = TextControlUtils.CreateTextControl(pnlParent))
            {
                for (int idx = 0; idx <= 1; idx++)
                {
                    rtfCode = idx == 0 ? BizDeInRa.MauDeThiRtfCode1 : BizDeInRa.MauDeThiRtfCode;
                    var tenDeThi = deInRa.TenDeThi; //STT-MaHocPhan.m1.m2.m3
                    // Xoá MaHocPhan khỏi tên đề thi
                    var idxSep = tenDeThi.IndexOf("-");
                    var idxDot = tenDeThi.IndexOf(".");
                    if (idxSep >= 0 && idxDot > idxSep)
                        tenDeThi = tenDeThi.Remove(idxSep, idxDot - idxSep);
                    rtfCode = rtfCode.Replace("\\{MA_DE_THI\\}", tenDeThi);

                    writeLog("1) loadRtfCode from template");
                    // Tạo ra nội dung đề thi
                    //rtbResult.Load(rtfCode, TXTextControl.StringStreamType.RichTextFormat);
                    LoadRtfCode(rtbResult, rtfCode);
                    writeLog("\tdone");

                    #region var dict = ...;
                    var dict = new Dictionary<string, string>();
                    dict.Add("{HOC_KY}", hocKy.TenHocKy.ToString());
                    dict.Add("{NAM_HOC}", namHoc.NamHoc1);
                    dict.Add("{GIO_THI}", deInRa.GioThi);
                    dict.Add("{NGAY_THI}", deInRa.NgayThi);
                    dict.Add("{TEN_HOC_PHAN}", deInRa.TenHocPhan);
                    dict.Add("{MA_HOC_PHAN}", deInRa.MaHocPhan);
                    dict.Add("{SO_TIN_CHI}", deInRa.SoTinChi.ToString());
                    dict.Add("{THOI_GIAN_LAM_BAI}", deInRa.ThoiGianLamBai.ToString() + " phút");
                    dict.Add("{DUOC_SU_DUNG_TAI_LIEU}", deInRa.DuocSuDungTaiLieu ? "Được sử dụng tài liệu" : "Không được sử dụng tài liệu");
                    #endregion
                    writeLog("2) replace dict");
                    rtbResult.FindAndReplace(dict);
                    writeLog("\tdone");

                    #region DeInRa deThi = ...;
                    DeInRa deThi;
                    if (needToLoadDetailDataOfDeInRa)
                        deThi = context.DeInRaDbSet
                            .Include("CauHoiCollection")
                            .Include("CauHoiCollection.Khoi")
                            .Where(x => x.MaDeThi == deInRa.MaDeThi)
                            .FirstOrDefault();
                    else
                        deThi = deInRa;
                    #endregion
                    var lstCauHoi = deThi.CauHoiCollection;

                    #region rtbAllQuestions = nội dung các câu hỏi
                    var idxCauHoi = 0;
                    var rtbAllQuestions = TextControlUtils.CreateTextControl(pnlParent);

                    var lstQuestionTitles = new List<string>();
                    foreach (var cauHoi in lstCauHoi)
                    {
                        #region var stQuestionRtfCode chứa nội dung câu hỏi thứ i
                        idxCauHoi++;
                        var stTieuDeCauHoi = string.Format("Câu {0} ({1}): ", idxCauHoi, cauHoi.Khoi.SoDiem);
                        var stNoiDungCauHoiRtfCode = cauHoi.NoiDungCauHoi_RTF;
                        writeLog("generate question {0}/{1}... ({2})", idxCauHoi, lstCauHoi.Count, stTieuDeCauHoi);

                        lstQuestionTitles.Add(stTieuDeCauHoi);

                        TXTextControl.TextControl rtbQuestion = TextControlUtils.CreateTextControl(pnlParent);
                        writeLog("\tformatizing question...");
                        SetQuestionContent(rtbQuestion, stTieuDeCauHoi, stNoiDungCauHoiRtfCode);
                        var stQuestionRtfcode = rtbQuestion.GetRtfCode();
                        writeLog("\t\tdone");
                        //rtbQuestion.Dispose();
                        #endregion

                        rtbAllQuestions.Append(stQuestionRtfcode, TXTextControl.StringStreamType.RichTextFormat, TXTextControl.AppendSettings.StartWithNewParagraph);
                        //AppendRtfCode(rtbAllQuestions, stQuestionRtfcode);
                        pnlParent.Controls.Remove(rtbQuestion);
                        rtbQuestion.Dispose();
                        writeLog("\tappend generated question to rtbAllQuestions");
                    }
                    #endregion

                    #region Xử lý rtbAllQuestions để khỏi bị sai trong danh sách đánh số thứ tự
                    // TODO
                    // 1) Thử bỏ phần này xem có còn lỗi hay không?
                    // 2) Thử set ListType.None ngay sau khi AppendText.
                    rtbAllQuestions.InputPosition = new TXTextControl.InputPosition(0);
                    var lstMark = new List<int>(); // danh sách các điểm đánh dấu của các câu hỏi trong đề thi
                    for (int i = 0; i < lstQuestionTitles.Count; i++)
                    {
                        var idx1 = rtbAllQuestions.Find(lstQuestionTitles[i]);
                        lstMark.Add(idx1);
                    }
                    lstMark.Add(rtbAllQuestions.Text.Length - 1);

                    for (int i = 0; i < lstMark.Count - 1; i++)
                    {
                        for (int k = lstMark[i]; k <= lstMark[i + 1]; k++)
                        {
                            rtbAllQuestions.InputPosition = new TXTextControl.InputPosition(k);
                            var format = rtbAllQuestions.Selection.ListFormat;
                            if (format.Type != TXTextControl.ListType.None)
                            {
                                if (format.RestartNumbering == false)
                                {
                                    format.RestartNumbering = true;
                                    break;
                                }
                            }
                        }
                    }
                    #endregion

                    writeLog("replace NOI_DUNG_CAU_HOI to rtbAllQuestions");
                    rtbResult.FindAndReplace("{NOI_DUNG_CAU_HOI}", rtbAllQuestions);

                    rtbResult.Update();

                    if (rtbResult.Pages > 1)
                        break;
                }
                string stRtfOutput = null;
                rtbResult.Save(out stRtfOutput, TXTextControl.StringStreamType.RichTextFormat);
                pnlParent.Controls.Remove(rtbResult);
                rtbResult.Dispose();
                writeLog("done for deInRa {0}-----------------------", deInRa.TenDeThi);
                return stRtfOutput;
            }
        }

        /// <summary>
        /// Lấy nội dung đề thi (dưới dạng RtfCode)
        /// </summary>
        /// <param name="deInRa"></param>
        /// <param name="hocKy"></param>
        /// <param name="namHoc"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public static string GetNoiDungDapAn(
            Panel pnlParent,
            DAL.Models.DeInRa deInRa,
            DAL.Models.HocKy hocKy,
            DAL.Models.NamHoc namHoc,
            DAL.Models.QLNHD_KHContext context,
            bool needToLoadDetailDataOfDeInRa = false)
        {
            var sbErrors = new StringBuilder();
            using (var rtbResult = TextControlUtils.CreateTextControl(pnlParent))
            {
                for (int idx = 0; idx <= 1; idx++)
                {
                    string rtfCode = idx == 0 ? BizDeInRa.MauDapAnRtfCode1 : BizDeInRa.MauDapAnRtfCode;
                    rtfCode = rtfCode.Replace("\\{MA_DE_THI\\}", deInRa.TenDeThi);

                    // Tạo ra nội dung đáp án
                    rtbResult.Load(rtfCode, TXTextControl.StringStreamType.RichTextFormat);

                    #region var dict = new Dictionary<string, string>()...;
                    var dict = new Dictionary<string, string>();
                    dict.Add("{HOC_KY}", hocKy.TenHocKy.ToString());
                    dict.Add("{NAM_HOC}", namHoc.NamHoc1);
                    dict.Add("{GIO_THI}", deInRa.GioThi);
                    dict.Add("{NGAY_THI}", deInRa.NgayThi);
                    dict.Add("{TEN_HOC_PHAN}", deInRa.TenHocPhan);
                    dict.Add("{MA_HOC_PHAN}", deInRa.MaHocPhan);
                    dict.Add("{SO_TIN_CHI}", deInRa.SoTinChi.ToString());
                    dict.Add("{THOI_GIAN_LAM_BAI}", deInRa.ThoiGianLamBai.ToString() + " phút");
                    dict.Add("{DUOC_SU_DUNG_TAI_LIEU}", deInRa.DuocSuDungTaiLieu ? "Được sử dụng tài liệu" : "Không được sử dụng tài liệu");
                    #endregion
                    rtbResult.FindAndReplace(dict);

                    #region DeInRa dethi = nạp danh sách các câu hỏi trong đề thi;
                    DeInRa deThi;
                    if (needToLoadDetailDataOfDeInRa)
                        deThi = context.DeInRaDbSet
                            .Include("CauHoiCollection")
                            .Include("CauHoiCollection.Khoi")
                            .Where(x => x.MaDeThi == deInRa.MaDeThi)
                            .FirstOrDefault();
                    else
                        deThi = deInRa;
                    #endregion
                    var lstCauHoi = deThi.CauHoiCollection;

                    #region rtbAllAnswers = nội dung đáp án cho các câu hỏi
                    var rtbAllAnswers = TextControlUtils.CreateTextControl(pnlParent);
                    foreach (var cauHoi in lstCauHoi)
                    {
                        #region rtbQuestion chứa nội dung câu hỏi thứ i
                        try
                        {
                            if (string.IsNullOrEmpty(cauHoi.NoiDungTraLoi_RTF) == false)
                                rtbAllAnswers.AppendRtfCode(cauHoi.NoiDungTraLoi_RTF);
                            else
                                throw new Exception("Không có nội dung trả lời cho câu hỏi " + cauHoi.TenCauHoi);
                        }
                        catch (Exception exc)
                        {
                            sbErrors.AppendFormat(exc.ToString() + "\r\n");
                            //sbErrors.AppendFormat("Đáp án cho câu hỏi {0}: {1} - {2}\r\n\r\n", cauHoi.TenCauHoi, exc.Message, exc.StackTrace);
                        }
                        #endregion
                    }
                    #endregion

                    var error = sbErrors.ToString();
                    if (string.IsNullOrEmpty(error) == false)
                    {
                        rtbResult.FindAndReplace("{NOI_DUNG_TRA_LOI}", error);
                        break;
                    }
                    else
                    {
                        try
                        {
                            var table = rtbAllAnswers.Tables.GetItem(rtbAllAnswers.Tables.Count - 1);
                            table.Columns.GetItem(1).Width = 21 * 60;
                            table.Columns.GetItem(3).Width = 21 * 60;
                            rtbAllAnswers.Selection.Start = table.Cells.GetItem(1, 1).Start - 1;
                            table.Rows.Add(TXTextControl.TableAddPosition.Before, 1);

                            //int n = table.Columns.Count;
                            //for (int i = 0; i < table.Rows.Count; i++)
                            //{
                            //    var row = table.Rows.GetItem(i);
                            //    //for (int j = 0; j < table.Columns.Count; j++)
                            //    table.Cells.GetItem(i, n).Width = 21 * 50;
                            //}

                            table.Cells.GetItem(1, 1).Text = "Nội dung";
                            table.Cells.GetItem(1, 3).Text = "Điểm";
                            rtbAllAnswers.Selection.Start = table.Cells.GetItem(1, 1).Start - 1;
                            rtbAllAnswers.Selection.Length = table.Cells.GetItem(1, 2).Start - table.Cells.GetItem(1, 1).Start + 1;
                            table.MergeCells();

                            //table.Columns.GetItem(2).Width = 50;

                            //rtbAllAnswers.Selection.Start = table.Cells.GetItem(0, 0).Start - 1;
                            //table.Rows.Remove();
                        }
                        catch (Exception exc)
                        {
                            //rtbResult.FindAndReplace("{NOI_DUNG_TRA_LOI}", exc.ToString());
                            //break;
                        }

                        rtbResult.FindAndReplace("{NOI_DUNG_TRA_LOI}", rtbAllAnswers);

                        rtbResult.Update();

                        if (rtbResult.Pages > 1)
                            break;
                    }
                }
                string stRtfOutput = null;
                rtbResult.Save(out stRtfOutput, TXTextControl.StringStreamType.RichTextFormat);
                pnlParent.Controls.Remove(rtbResult);
                rtbResult.Dispose();
                return stRtfOutput;
            }
        }

        public FormDeThi_ChiTiet(DeInRa deInRa, HocKy hocKy, NamHoc namHoc)
        {
            this._frozen = true;
            InitializeComponent();
            cbxDeOrDapAn.SelectedIndex = 0;
            this.m_DeThi = deInRa;
            this.m_NamHoc = namHoc;
            this.m_HocKy = hocKy;
        }

        private void FormDeThi_ChiTiet_Shown(object sender, EventArgs e)
        {
            _frozen = false;
            UpdateView();

            //picLoading.SizeMode = PictureBoxSizeMode.CenterImage;
            //picLoading.Size = this.ClientSize;
            //picLoading.Location = new Point(0, 0);
            //picLoading.Visible = true;
            //rtbNoiDung.Visible = false;

            //var bw = new BackgroundWorker();
            //bw.DoWork += (oSender, oE) =>
            //{
            //    #region DoWork
            //    if (string.IsNullOrEmpty(m_DeThi.NoiDungDeThi))
            //        oE.Result = GetGeneratedRtfCodeForDeThi(m_DeThi);
            //    else
            //        oE.Result = m_DeThi.NoiDungDeThi;
            //    #endregion
            //};

            //bw.RunWorkerCompleted += (oSender, oE) =>
            //{
            //    #region RunWorkwerCompleted
            //    var rtfCode = oE.Result.ToString();
            //    rtbDeInRa.SetRtfCode(rtfCode);
            //    picLoading.Visible = false;
            //    rtbDeInRa.Visible = true;
            //    #endregion
            //};

            //bw.RunWorkerAsync();
        }

        private void btnGhiXuongDia_Click(object sender, EventArgs e)
        {
            var dlg = new SaveFileDialog();
            dlg.Filter = "Tệp RTF (*.rtf)|*.rtf";
            dlg.Title = "Lưu nội dung đề thi xuống đĩa...";
            if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                rtbNoiDung.SaveToRtfFile(dlg.FileName);
            }
        }

        private void btnSaveToDB_Click(object sender, EventArgs e)
        {
            try
            {
                var rtfCode = rtbNoiDung.GetRtfCode();
                if (cbxDeOrDapAn.SelectedIndex == 0)
                {
                    #region Đề thi
                    BizDeInRa.UpdateNoiDungDeThi(m_DeThi, rtfCode, this.Context);
                    Utils.Notify(this, "Cập nhật đề thi", "Đã cập nhật đề thi thành công");
                    #endregion
                }
                else
                {
                    #region Đáp án
                    BizDeInRa.UpdateNoiDungDapAn(m_DeThi, rtfCode, this.Context);
                    Utils.Notify(this, "Cập nhật đề thi", "Đã cập nhật đáp án thành công");
                    #endregion
                }
            }
            catch (Exception exc)
            {
                DialogUtils.ShowError("Xuất hiện lỗi trong quá trình cập nhật nội dung đề thi\n" +
                    "Chi tiết lỗi: " + exc);
            }
        }

        private void btnGetGeneratedNoiDungDeThi_Click(object sender, EventArgs e)
        {
            try
            {
                string rtfCode;
                if (cbxDeOrDapAn.SelectedIndex == 0)
                {
                    rtfCode = GetNoiDungDeThi(pnlPlaceholder, m_DeThi, m_HocKy, m_NamHoc, Context, needToLoadDetailDataOfDeInRa: true);
                }
                else
                {
                    rtfCode = GetNoiDungDapAn(pnlPlaceholder, m_DeThi, m_HocKy, m_NamHoc, Context, needToLoadDetailDataOfDeInRa: true);
                }

                if (string.IsNullOrEmpty(rtfCode))
                    throw new Exception("RTFCode = NULL/Empty");

                rtbNoiDung.SetRtfCode(rtfCode); //on GetGeneeatedNoiDungDeThi clicked
            }
            catch (Exception exc)
            {
                MessageBox.Show("Xuất hiện lỗi trong quá trình khôi phục nội dung mặc định của đề thi.\nThông tin chi tiết lỗi:\r\n" + exc.ToString());
            }
        }

        private void btnXemTruocKhiIn_Click(object sender, EventArgs e)
        {
            var docName = string.Format("Đề thi {0} ({1}), học kỳ {2} năm học {3}", m_DeThi.HocPhan.TenHocPhan, m_DeThi.MaHocPhan, m_HocKy.TenHocKy, m_NamHoc.NamHoc1);
            rtbNoiDung.PrintPreview(docName);
        }

        private void btnIn_Click(object sender, EventArgs e)
        {
            var docName = string.Format("Đề thi {0} ({1}), học kỳ {2} năm học {3}", m_DeThi.HocPhan.TenHocPhan, m_DeThi.MaHocPhan, m_HocKy.TenHocKy, m_NamHoc.NamHoc1);
            rtbNoiDung.Print(docName);
        }

        private bool _frozen;
        private void cbxDeOrDapAn_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (_frozen == false)
                UpdateView();
        }

        private void UpdateView()
        {
            try
            {
                if (cbxDeOrDapAn.SelectedIndex == 0)
                {
                    #region Hiển thị nội dung đề thi
                    var rtfNoiDungDeThi = "";
                    var stPath = m_DeThi.NoiDungDeThi_FullPath();
                    if (File.Exists(stPath))
                        rtfNoiDungDeThi = File.ReadAllText(stPath);
                    else
                    {
                        rtfNoiDungDeThi = GetNoiDungDeThi(pnlPlaceholder, m_DeThi, m_HocKy, m_NamHoc, this.Context, needToLoadDetailDataOfDeInRa: true);
                        BizDeInRa.WriteNoiDungDeThi(m_DeThi, rtfNoiDungDeThi);
                    }
                    rtbNoiDung.SetRtfCode2(rtfNoiDungDeThi);
                    #endregion
                }
                else
                {
                    #region Hiển thị nội dung đáp án
                    var rtfNoiDungDapAn = "";
                    var stPath = m_DeThi.NoiDungDapAn_FullPath();
                    if (File.Exists(stPath))
                        rtfNoiDungDapAn = File.ReadAllText(stPath);
                    else
                    {
                        rtfNoiDungDapAn = GetNoiDungDapAn(pnlPlaceholder, m_DeThi, m_HocKy, m_NamHoc, this.Context, needToLoadDetailDataOfDeInRa: true);
                        BizDeInRa.WriteNoiDungDapAn(m_DeThi, rtfNoiDungDapAn);
                    }
                    rtbNoiDung.SetRtfCode2(rtfNoiDungDapAn);
                    #endregion
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show("Xuất hiện lỗi trong quá trình trình bày nội dung đề thi " + exc.Message + "\nChi tiết:\n" + exc.StackTrace);
                rtbNoiDung.Text = "";
            }
        }

        private void FormDeThi_ChiTiet_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                if (m_Context != null)
                    m_Context.Dispose();
            }
            catch { }
        }

        //private string GetGeneratedRtfCodeForDeThi(DAL.Models.DeInRa deInRa)
        //{
        //    using (var rtbDeInRa2 = TextControlUtils.CreateTextControl())
        //    {
        //        var rtfCode = BizDeInRa.MauDeThiVaDapAnRtfCode;
        //        rtfCode = rtfCode.Replace("\\{MA_DE_THI\\}", deInRa.TenDeThi);

        //        // Tạo ra nội dung đề thi
        //        rtbDeInRa2.Load(rtfCode, TXTextControl.StringStreamType.RichTextFormat);

        //        var dict = new Dictionary<string, string>();
        //        dict.Add("{HOC_KY}", m_HocKy.TenHocKy.ToString());
        //        dict.Add("{NAM_HOC}", m_NamHoc.NamHoc1);
        //        dict.Add("{GIO_THI}", deInRa.GioThi);
        //        dict.Add("{NGAY_THI}", deInRa.NgayThi);
        //        dict.Add("{TEN_HOC_PHAN}", deInRa.TenHocPhan);
        //        dict.Add("{MA_HOC_PHAN}", deInRa.MaHocPhan);
        //        dict.Add("{SO_TIN_CHI}", deInRa.SoTinChi.ToString());
        //        dict.Add("{THOI_GIAN_LAM_BAI}", deInRa.ThoiGianLamBai.ToString() + " phút");
        //        dict.Add("{DUOC_SU_DUNG_TAI_LIEU}", deInRa.DuocSuDungTaiLieu ? "Được sử dụng tài liệu" : "Không được sử dụng tài liệu");
        //        rtbDeInRa2.FindAndReplace(dict);
        //        rtbDeInRa2.FindAndReplace(dict);

        //        using (var context = QLNHD_KHContext.GetContext())
        //        {
        //            var deThi = context.DeInRaDbSet
        //                .Include("CauHoiCollection")
        //                .Include("CauHoiCollection.Khoi")
        //                .Where(x => x.MaDeThi == deInRa.MaDeThi)
        //                .FirstOrDefault();
        //            var lstCauHoi = deThi.CauHoiCollection;

        //            #region rtbAllQuestions = nội dung các câu hỏi
        //            var idxCauHoi = 0;
        //            var rtbAllQuestions = TextControlUtils.CreateTextControl();
        //            var rtbQuestion = TextControlUtils.CreateTextControl();
        //            var rtbAllAnswers = TextControlUtils.CreateTextControl();
        //            var lstQuestionTitles = new List<string>();
        //            foreach (var cauHoi in lstCauHoi)
        //            {
        //                #region Xử lý và ghi câu hỏi thứ i ra tempFileI
        //                idxCauHoi++;
        //                rtbQuestion.Clear();
        //                var stQuestionTitle = string.Format("Câu {0} ({1})", idxCauHoi, cauHoi.Khoi.SoDiem);
        //                lstQuestionTitles.Add(stQuestionTitle);
        //                rtbQuestion.Text = stQuestionTitle;
        //                rtbQuestion.SelectAll();
        //                rtbQuestion.Selection.FontName = "Times New Roman";
        //                rtbQuestion.Selection.Bold = true;
        //                rtbQuestion.Selection.FontSize = 20 * 13;
        //                rtbQuestion.Selection.ListFormat.Type = TXTextControl.ListType.None;
        //                rtbQuestion.Append(cauHoi.NoiDungCauHoi_RTF, TXTextControl.StringStreamType.RichTextFormat, TXTextControl.AppendSettings.StartWithNewParagraph);
        //                #endregion

        //                rtbAllQuestions.Append(rtbQuestion, TXTextControl.AppendSettings.StartWithNewParagraph);

        //                rtbAllAnswers.AppendRtfCode(cauHoi.NoiDungTraLoi_RTF);
        //            }
        //            #endregion

        //            #region Xử lý rtbAllQuestions để khỏi bị sai trong danh sách đánh số thứ tự
        //            rtbAllQuestions.InputPosition = new TXTextControl.InputPosition(0);
        //            var lstMark = new List<int>();
        //            for (int i = 0; i < lstQuestionTitles.Count; i++)
        //            {
        //                var idx1 = rtbAllQuestions.Find(lstQuestionTitles[i]);
        //                lstMark.Add(idx1);
        //            }
        //            lstMark.Add(rtbAllQuestions.Text.Length - 1);

        //            for (int i = 0; i < lstMark.Count - 1; i++)
        //            {
        //                for (int k = lstMark[i]; k <= lstMark[i + 1]; k++)
        //                {
        //                    rtbAllQuestions.InputPosition = new TXTextControl.InputPosition(k);
        //                    var format = rtbAllQuestions.Selection.ListFormat;
        //                    if (format.Type != TXTextControl.ListType.None)
        //                    {
        //                        if (format.RestartNumbering == false)
        //                        {
        //                            format.RestartNumbering = true;
        //                            break;
        //                        }
        //                    }
        //                }
        //            }
        //            #endregion

        //            rtbDeInRa2.FindAndReplace("{NOI_DUNG_CAU_HOI}", rtbAllQuestions);

        //            var table = rtbAllAnswers.Tables.GetItem(rtbAllAnswers.Tables.Count - 1);
        //            table.Columns.GetItem(1).Width = 21 * 60;
        //            table.Columns.GetItem(3).Width = 21 * 60;
        //            rtbAllAnswers.Selection.Start = table.Cells.GetItem(1, 1).Start - 1;
        //            table.Rows.Add(TXTextControl.TableAddPosition.Before, 1);

        //            //int n = table.Columns.Count;
        //            //for (int i = 0; i < table.Rows.Count; i++)
        //            //{
        //            //    var row = table.Rows.GetItem(i);
        //            //    //for (int j = 0; j < table.Columns.Count; j++)
        //            //    table.Cells.GetItem(i, n).Width = 21 * 50;
        //            //}

        //            table.Cells.GetItem(1, 1).Text = "Nội dung";
        //            table.Cells.GetItem(1, 3).Text = "Điểm";
        //            rtbAllAnswers.Selection.Start = table.Cells.GetItem(1, 1).Start - 1;
        //            rtbAllAnswers.Selection.Length = table.Cells.GetItem(1, 2).Start - table.Cells.GetItem(1, 1).Start + 1;
        //            table.MergeCells();

        //            //table.Columns.GetItem(2).Width = 50;

        //            //rtbAllAnswers.Selection.Start = table.Cells.GetItem(0, 0).Start - 1;
        //            //table.Rows.Remove();

        //            rtbDeInRa2.FindAndReplace("{NOI_DUNG_TRA_LOI}", rtbAllAnswers);
        //        }

        //        rtbDeInRa2.Update();

        //        string stRtfOutput = null;
        //        rtbDeInRa2.Save(out stRtfOutput, TXTextControl.StringStreamType.RichTextFormat);
        //        return stRtfOutput;
        //    }
        //}

        //public static string GetGeneratedRtfCodeForDeThi(DAL.Models.DeInRa deInRa,
        //    DAL.Models.HocKy hocKy,
        //    DAL.Models.NamHoc namHoc,
        //    DAL.Models.QLNHD_KHContext context)
        //{
        //    using (var rtbDeInRa2 = TextControlUtils.CreateTextControl())
        //    {
        //        var rtfCode = BizDeInRa.MauDeThiVaDapAnRtfCode;
        //        rtfCode = rtfCode.Replace("\\{MA_DE_THI\\}", deInRa.TenDeThi);

        //        // Tạo ra nội dung đề thi
        //        rtbDeInRa2.Load(rtfCode, TXTextControl.StringStreamType.RichTextFormat);

        //        var dict = new Dictionary<string, string>();
        //        dict.Add("{HOC_KY}", hocKy.TenHocKy.ToString());
        //        dict.Add("{NAM_HOC}", namHoc.NamHoc1);
        //        dict.Add("{GIO_THI}", deInRa.GioThi);
        //        dict.Add("{NGAY_THI}", deInRa.NgayThi);
        //        dict.Add("{TEN_HOC_PHAN}", deInRa.TenHocPhan);
        //        dict.Add("{MA_HOC_PHAN}", deInRa.MaHocPhan);
        //        dict.Add("{SO_TIN_CHI}", deInRa.SoTinChi.ToString());
        //        dict.Add("{THOI_GIAN_LAM_BAI}", deInRa.ThoiGianLamBai.ToString() + " phút");
        //        dict.Add("{DUOC_SU_DUNG_TAI_LIEU}", deInRa.DuocSuDungTaiLieu ? "Được sử dụng tài liệu" : "Không được sử dụng tài liệu");
        //        rtbDeInRa2.FindAndReplace(dict);
        //        rtbDeInRa2.FindAndReplace(dict);

        //        {
        //            var deThi = context.DeInRaDbSet
        //                .Include("CauHoiCollection")
        //                .Include("CauHoiCollection.Khoi")
        //                .Where(x => x.MaDeThi == deInRa.MaDeThi)
        //                .FirstOrDefault();
        //            var lstCauHoi = deThi.CauHoiCollection;

        //            #region rtbAllQuestions = nội dung các câu hỏi
        //            var idxCauHoi = 0;
        //            var rtbAllQuestions = TextControlUtils.CreateTextControl();
        //            var rtbQuestion = TextControlUtils.CreateTextControl();
        //            var rtbAllAnswers = TextControlUtils.CreateTextControl();
        //            var lstQuestionTitles = new List<string>();
        //            foreach (var cauHoi in lstCauHoi)
        //            {
        //                #region Xử lý và ghi câu hỏi thứ i ra tempFileI
        //                idxCauHoi++;
        //                rtbQuestion.Clear();
        //                var stQuestionTitle = string.Format("Câu {0} ({1})", idxCauHoi, cauHoi.Khoi.SoDiem);
        //                lstQuestionTitles.Add(stQuestionTitle);
        //                rtbQuestion.Text = stQuestionTitle;
        //                rtbQuestion.SelectAll();
        //                rtbQuestion.Selection.FontName = "Times New Roman";
        //                rtbQuestion.Selection.Bold = true;
        //                rtbQuestion.Selection.FontSize = 20 * 13;
        //                rtbQuestion.Selection.ListFormat.Type = TXTextControl.ListType.None;
        //                rtbQuestion.Append(cauHoi.NoiDungCauHoi_RTF, TXTextControl.StringStreamType.RichTextFormat, TXTextControl.AppendSettings.StartWithNewParagraph);
        //                #endregion

        //                rtbAllQuestions.Append(rtbQuestion, TXTextControl.AppendSettings.StartWithNewParagraph);

        //                rtbAllAnswers.AppendRtfCode(cauHoi.NoiDungTraLoi_RTF);
        //            }
        //            #endregion

        //            #region Xử lý rtbAllQuestions để khỏi bị sai trong danh sách đánh số thứ tự
        //            rtbAllQuestions.InputPosition = new TXTextControl.InputPosition(0);
        //            var lstMark = new List<int>();
        //            for (int i = 0; i < lstQuestionTitles.Count; i++)
        //            {
        //                var idx1 = rtbAllQuestions.Find(lstQuestionTitles[i]);
        //                lstMark.Add(idx1);
        //            }
        //            lstMark.Add(rtbAllQuestions.Text.Length - 1);

        //            for (int i = 0; i < lstMark.Count - 1; i++)
        //            {
        //                for (int k = lstMark[i]; k <= lstMark[i + 1]; k++)
        //                {
        //                    rtbAllQuestions.InputPosition = new TXTextControl.InputPosition(k);
        //                    var format = rtbAllQuestions.Selection.ListFormat;
        //                    if (format.Type != TXTextControl.ListType.None)
        //                    {
        //                        if (format.RestartNumbering == false)
        //                        {
        //                            format.RestartNumbering = true;
        //                            break;
        //                        }
        //                    }
        //                }
        //            }
        //            #endregion

        //            rtbDeInRa2.FindAndReplace("{NOI_DUNG_CAU_HOI}", rtbAllQuestions);

        //            var table = rtbAllAnswers.Tables.GetItem(rtbAllAnswers.Tables.Count - 1);
        //            table.Columns.GetItem(1).Width = 21 * 60;
        //            table.Columns.GetItem(3).Width = 21 * 60;
        //            rtbAllAnswers.Selection.Start = table.Cells.GetItem(1, 1).Start - 1;
        //            table.Rows.Add(TXTextControl.TableAddPosition.Before, 1);

        //            //int n = table.Columns.Count;
        //            //for (int i = 0; i < table.Rows.Count; i++)
        //            //{
        //            //    var row = table.Rows.GetItem(i);
        //            //    //for (int j = 0; j < table.Columns.Count; j++)
        //            //    table.Cells.GetItem(i, n).Width = 21 * 50;
        //            //}

        //            table.Cells.GetItem(1, 1).Text = "Nội dung";
        //            table.Cells.GetItem(1, 3).Text = "Điểm";
        //            rtbAllAnswers.Selection.Start = table.Cells.GetItem(1, 1).Start - 1;
        //            rtbAllAnswers.Selection.Length = table.Cells.GetItem(1, 2).Start - table.Cells.GetItem(1, 1).Start + 1;
        //            table.MergeCells();

        //            //table.Columns.GetItem(2).Width = 50;

        //            //rtbAllAnswers.Selection.Start = table.Cells.GetItem(0, 0).Start - 1;
        //            //table.Rows.Remove();

        //            rtbDeInRa2.FindAndReplace("{NOI_DUNG_TRA_LOI}", rtbAllAnswers);
        //        }

        //        rtbDeInRa2.Update();

        //        string stRtfOutput = null;
        //        rtbDeInRa2.Save(out stRtfOutput, TXTextControl.StringStreamType.RichTextFormat);
        //        return stRtfOutput;
        //    }
        //}
    }
}
